package edu.javeriana.aes.psw.receiver;

import edu.javeriana.aes.psw.context.ControllerListener;
import edu.javeriana.aes.psw.mensaje.Mensaje;
import edu.javeriana.aes.psw.mensaje.MensajeBean;
import java.io.ByteArrayInputStream;
import java.io.DataInputStream;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.MulticastSocket;

public class UDPReceiver implements Receiver {

    private boolean isAlive = true;
    private ControllerListener listener;
    private MulticastSocket socket;

    public UDPReceiver(ControllerListener listener) throws IOException {
        this.listener = listener;
        socket = new MulticastSocket(8090);
    }

    @Override
    public void recibir() {
        while (isAlive) {
            DatagramPacket packet = new DatagramPacket(new byte[55], 55);
            try {
                socket.receive(packet);
                if (packet.getLength() == 55) {
                    ByteArrayInputStream bais = new ByteArrayInputStream(packet.getData());
                    DataInputStream dis = new DataInputStream(bais);
                    
                    double temperatura = dis.readDouble();
                    long timestamp = dis.readLong();
                    int frecuencia = dis.readInt();

                    byte[] ip = new byte[15];
                    dis.read(ip);
                                       
                    byte[] hostname = new byte[20];
                    dis.read(hostname);

                    Mensaje mensaje = new MensajeBean(
                            new String(ip),
                            new String(hostname),
                            temperatura,
                            timestamp,
                            frecuencia);

                    listener.notificarMensajeUDP(mensaje);
                    dis.close();
                }
            } catch (IOException ex) {
                System.out.println(ex);
            }
        }
    }

    @Override
    public void finalizar() {
        isAlive = false;
        socket.close();
    }
}
